* enhance garmin gpi reader and writer.
1. fix a few memory leaks.
2. properly encode category passed from user to writer.
3. add support for reading gpi files with dual language strings.
4. add support for code page 65001, i.e. utf8.
5. make sure writer embeds encoded string lengths instead of the lengths of source QStrings.
6. enhance test to cover all of the above.
* correct reference mode.
* fix garmin_gpi test for windows.
* rename garmin_gpi country code to language code.
static char* opt_cat, *opt_pos, *opt_notes, *opt_hide_bitmap, *opt_descr, *opt_bitmap;
static char* opt_unique, *opt_alerts, *opt_units, *opt_speed, *opt_proximity, *opt_sleep;
+static char* opt_lang;
static char* opt_writecodec;
static double defspeed, defproximity;
static int alerts;
"writecodec", &opt_writecodec, "codec to use for writing strings",
"windows-1252", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
},
+ {
+ "languagecode", &opt_lang, "language code to use for reading dual language files",
+ NULL, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
ARG_TERMINATOR
};
typedef struct {
- public:
+public:
int D2;
char S3[9]; /* "GRMRECnn" */
time_t crdate; /* creation date and time */
} gpi_waypt_t;
static gbfile* fin, *fout;
-static int16_t codepage; /* code-page, i.e. 1252 */
+static uint16_t codepage; /* code-page, e.g. 1252, 65001 */
static reader_data_t* rdata;
static writer_data_t* wdata;
static short_handle short_h;
return gmsd;
}
+static char*
+gpi_read_lc_string_old(const char* field, char* languagecode, short* length)
+{
+ char lc[3];
+ short len;
+
+ gbfread(lc, 1, 2, fin);
+ lc[2] = '\0';
+ len = gbfgetint16(fin);
+
+ if ((lc[0] < 'A') || (lc[0] > 'Z') || (lc[1] < 'A') || (lc[1] > 'Z')) {
+ fatal(MYNAME ": Invalid language code %s!\n", lc);
+ }
+ char* res = (char*) xmalloc(len + 1);
+ res[len] = '\0';
+ PP;
+ if (len > 0) {
+ gbfread(res, 1, len, fin);
+ }
+
+ strncpy(languagecode, lc, sizeof(lc));
+ *length = len;
+ return res;
+}
+
/* read a standard string with or without 'EN' (or whatever) header */
static char*
gpi_read_string_old(const char* field)
{
- int l1;
+ int l0;
char* res = NULL;
- l1 = gbfgetint16(fin);
- if (l1 > 0) {
- short l2;
+ l0 = gbfgetint16(fin);
+ if (l0 > 0) {
char first;
first = gbfgetc(fin);
if (first == 0) {
- char en[2];
+ short l1;
+ short l2;
+ char* res1 = NULL;
+ char* res2 = NULL;
+ char lc1[3] = "";
+ char lc2[3] = "";
is_fatal((gbfgetc(fin) != 0),
MYNAME ": Error reading field '%s'!", field);
- gbfread(en, 1, sizeof(en), fin);
- l2 = gbfgetint16(fin);
- is_fatal((l2 + 4 != l1),
- MYNAME ": Error out of sync (wrong size %d/%d) on field '%s'!", l1, l2, field);
-
- if ((en[0] < 'A') || (en[0] > 'Z') || (en[1] < 'A') || (en[1] > 'Z')) {
- fatal(MYNAME ": Invalid country code!\n");
- }
- res = (char*) xmalloc(l2 + 1);
- res[l2] = '\0';
- PP;
- if (l2 > 0) {
- gbfread(res, 1, l2, fin);
+ res1 = gpi_read_lc_string_old(field, lc1, &l1);
+ if ((l1 + 4) < l0) { // dual language?
+ res2 = gpi_read_lc_string_old(field, lc2, &l2);
+ is_fatal((l1 + 4 + l2 + 4 != l0),
+ MYNAME ": Error out of sync (wrong size %d/%d/%d) on field '%s'!", l0, l1, l2, field);
+ if (opt_lang && (strcmp(opt_lang, lc1) == 0)) {
+ res = res1;
+ xfree(res2);
+ } else if (opt_lang && (strcmp(opt_lang, lc2) == 0)) {
+ res = res2;
+ xfree(res1);
+ } else {
+ fatal(MYNAME ": Must select language code, %s and %s found.\n", lc1, lc2);
+ }
+ } else { // normal case, single language
+ is_fatal((l1 + 4 != l0),
+ MYNAME ": Error out of sync (wrong size %d/%d) on field '%s'!", l0, l1, field);
+ res = res1;
}
} else {
- res = (char*) xmalloc(l1 + 1);
+ res = (char*) xmalloc(l0 + 1);
*res = first;
- *(res + l1) = '\0';
+ *(res + l0) = '\0';
PP;
- l1--;
- if (l1 > 0) {
- gbfread(res + 1, 1, l1, fin);
+ l0--;
+ if (l0 > 0) {
+ gbfread(res + 1, 1, l0, fin);
}
}
}
#ifdef GPI_DBG
- dbginfo("%s: %s\n", field, (res == NULL) ? "<NULL>" : res);
+ dbginfo("%s: \"%s\"\n", field, (res == NULL) ? "<NULL>" : res);
#endif
return res;
}
static QString
gpi_read_string(const char* field)
{
- char*s = gpi_read_string_old(field);
- QString rv = STRTOUNICODE(s);
+ char* s = gpi_read_string_old(field);
+ QString rv = STRTOUNICODE(s).trimmed();
xfree(s);
return rv;
}
}
gbfread(&rdata->S8, 1, sizeof(rdata->S8) - 1, fin);
- codepage = gbfgetint16(fin);
+ codepage = gbfgetuint16(fin);
+#ifdef GPI_DBG
+ PP;
+ dbginfo("Code Page: %d\n",codepage);
+#endif
(void) gbfgetint16(fin); /* typically 0, but 0x11 in
Garminonline.de files. */
case 0x8000b: /* address (street/city...) */
(void) gbfgetint32(fin);
- // FALLTHROUGH
+ // FALLTHROUGH
case 0xb: /* as seen in German POI files. */
PP;
mask = gbfgetint16(fin); /* address fields mask */
case 0x80012: /* ? sounds / images ? */
break;
- /* Images? Seen in http://geepeeex.com/Stonepages.gpi */
+ /* Images? Seen in http://geepeeex.com/Stonepages.gpi */
case 0xd:
break;
gbfwrite(str, 1, len, fout);
}
-static void
-write_string(const QString& str, const char long_format)
-{
- write_string(STRFROMUNICODE(str), long_format);
-}
-
-
static int
compare_wpt_cb(const queue* a, const queue* b)
{
queue* elem, *tmp;
int res = 0;
- if (QUEUE_EMPTY(&data->Q))
- goto skip_empty_block; /* do not issue an empty block */
+ if (QUEUE_EMPTY(&data->Q)) {
+ goto skip_empty_block; /* do not issue an empty block */
+ }
res = 23; /* bounds, ... of tag 0x80008 */
res += 12; /* tag/sz/sub-sz */
res += 19; /* poi fixed size */
- res += wpt->shortname.length();
+ res += strlen(STRFROMUNICODE(wpt->shortname));
if (! opt_hide_bitmap) {
res += 10; /* tag(4) */
}
str = QString();
if (opt_descr) {
if (!wpt->description.isEmpty()) {
- str = xstrdup(wpt->description);
+ str = wpt->description;
}
} else if (opt_notes) {
if (!wpt->notes.isEmpty()) {
- str = xstrdup(wpt->notes);
+ str = wpt->notes;
}
} else if (opt_pos) {
str = pretty_deg_format(wpt->latitude, wpt->longitude, 's', " ", 0);
}
// if (str && (strcmp(str, wpt->shortname) == 0)) str = NULL;
if (!str.isEmpty()) {
- res += (12 + 4 + str.length());
+ res += (12 + 4 + strlen(STRFROMUNICODE(str)));
}
}
data->sz = res;
- if (QUEUE_EMPTY(&data->Q))
+ if (QUEUE_EMPTY(&data->Q)) {
return res;
+ }
return res + 12; /* + 12 = caller needs info about tag header size */
}
{
queue* elem, *tmp;
- if (QUEUE_EMPTY(&data->Q))
- goto skip_empty_block; /* do not issue an empty block */
+ if (QUEUE_EMPTY(&data->Q)) {
+ goto skip_empty_block; /* do not issue an empty block */
+ }
gbfputint32(0x80008, fout);
gbfputint32(data->sz, fout);
}
gbfputint32(0x80002, fout);
- s0 = s1 = 19 + wpt->shortname.length();
+ s0 = s1 = 19 + strlen(STRFROMUNICODE(wpt->shortname));
if (! opt_hide_bitmap) {
s0 += 10; /* tag(4) */
}
if (!str.isEmpty()) {
- s0 += (12 + 4 + str.length()); /* descr */
+ s0 += (12 + 4 + strlen(STRFROMUNICODE(str))); /* descr */
}
if (dt->sz) {
s0 += (12 + dt->sz); /* address part */
gbfputint16(1, fout); /* ? always 1 ? */
gbfputc(alerts, fout); /* seems to be 1 when extra options present */
- write_string(wpt->shortname, 1);
+ write_string(STRFROMUNICODE(wpt->shortname), 1);
if (dt->alerts) {
char flag = 0;
if (!str.isEmpty()) {
gbfputint32(0xa, fout);
- gbfputint32(str.length() + 8, fout); /* string + string header */
- write_string(str, 1);
+ gbfputint32(strlen(STRFROMUNICODE(str)) + 8, fout); /* string + string header */
+ write_string(STRFROMUNICODE(str), 1);
}
if (dt->sz) { /* gpi address */
sz = wdata_compute_size(wdata);
sz += 8; /* string header */
- sz += strlen(opt_cat);
+ sz += strlen(STRFROMUNICODE(QString::fromUtf8(opt_cat)));
gbfputint32(0x80009, fout);
if ((! opt_hide_bitmap) && image_sz) {
gbfputint32(sz, fout);
}
gbfputint32(sz, fout);
- write_string(opt_cat, 1);
+ write_string(STRFROMUNICODE(QString::fromUtf8(opt_cat)), 1);
wdata_write(wdata);
if ((codepage >= 1250) && (codepage <= 1257)) {
QString qCodecName = QString("windows-%1").arg(codepage);
cet_convert_init(CSTR(qCodecName), 1);
+ } else if (codepage == 65001) {
+ cet_convert_init("utf8", 1);
} else {
fatal(MYNAME ": Unsupported code page (%d). File is likely encrypted.\n", codepage);
}
break;
}
}
+ if (! codepage) {
+ if (QString("utf8").compare(QString(opt_writecodec), Qt::CaseInsensitive) == 0) {
+ codepage = 65001;
+ }
+ }
if (! codepage) {
warning(MYNAME ": Unsupported character set (%s)!\n", opt_writecodec);
- fatal(MYNAME ": Valid values are windows-1250 to windows-1257.\n");
+ fatal(MYNAME ": Valid values are windows-1250 to windows-1257 and utf8.\n");
}
cet_convert_init(opt_writecodec,1);
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="59.829069972" minlon="30.234490000" maxlat="60.067550037" maxlon="30.500100022"/>
+ <wpt lat="59.944070019" lon="30.306679979">
+ <name>About Saint-Petersburg Metro - 2016.05</name>
+ <cmt>This file represents information about metro stations in aint-Petersburg. Published by NAVICOM, 2016. http://navicom.ru</cmt>
+ <desc>This file represents information about metro stations in aint-Petersburg. Published by NAVICOM, 2016. http://navicom.ru</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.830660019" lon="30.500100022">
+ <name>RYBACKOE</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934429992" lon="30.329949986">
+ <name>NEVSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.944460029" lon="30.359629970">
+ <name>CHERNYSHEVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.924250003" lon="30.385180023">
+ <name>PLOSCHAD' ALEKSANDRA NEVSKOGO-1</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.923509965" lon="30.383310020">
+ <name>PLOSCHAD' ALEKSANDRA NEVSKOGO-2</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934940031" lon="30.330100022">
+ <name>NEVSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.896519985" lon="30.423599984">
+ <name>ELIZAROVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.879080011" lon="30.318629974">
+ <name>ELEKTROSILA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.922289979" lon="30.335769961">
+ <name>ZVENIGORODSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.920589961" lon="30.329700038">
+ <name>PUSHKINSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.849180002" lon="30.321059972">
+ <name>MOSKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926299965" lon="30.317890020">
+ <name>SADOVAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.895710042" lon="30.357010039">
+ <name>VOLKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.935459960" lon="30.326920012">
+ <name>NEVSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.931509988" lon="30.360439997">
+ <name>PLOSCHAD' VOSSTANIYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929549964" lon="30.361009967">
+ <name>PLOSCHAD' VOSSTANIYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.931519963" lon="30.355010033">
+ <name>MAYAKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.920600019" lon="30.354880029">
+ <name>LIGOVSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.927569991" lon="30.347969988">
+ <name>VLADIMIRSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928220008" lon="30.346220015">
+ <name>DOSTOEVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.916309994" lon="30.318670040">
+ <name>TEHNOLOGICHESKII INSTITUT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.907119991" lon="30.299419994">
+ <name>BALTIISKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.906179961" lon="30.317830006">
+ <name>FRUNZENSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.927089959" lon="30.320629980">
+ <name>SENNAYA PLOSCHAD'</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.901079992" lon="30.274850037">
+ <name>NARVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.879609998" lon="30.261939978">
+ <name>KIROVSKII ZAVOD</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.867220037" lon="30.261330027">
+ <name>AVTOVO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.842180023" lon="30.249950001">
+ <name>PROSPEKT VETERANOV</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.891529987" lon="30.318090012">
+ <name>MOSKOVSKIE VOROTA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.866259973" lon="30.321779978">
+ <name>PARK POBEDY</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.853289984" lon="30.320870038">
+ <name>MOSKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.853199963" lon="30.321640000">
+ <name>MOSKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.833129998" lon="30.349370018">
+ <name>ZVEZDNAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.848610032" lon="30.457699997">
+ <name>OBUHOVO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.865209972" lon="30.470139999">
+ <name>PROLETARSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.877270022" lon="30.441740016">
+ <name>LOMONOSOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.829069972" lon="30.375319971">
+ <name>KUPCHINO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.829949988" lon="30.374870030">
+ <name>KUPCHINO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.849370020" lon="30.322060017">
+ <name>MOSKOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.914630009" lon="30.349509995">
+ <name>OBVODNYI KANAL</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926580004" lon="30.317119975">
+ <name>SPASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.935860028" lon="30.314989965">
+ <name>ADMIRALTEISKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926719982" lon="30.319720041">
+ <name>SPASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934000000" lon="30.333390003">
+ <name>GOSTINYI DVOR</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.841279974" lon="30.253230007">
+ <name>PROSPEKT VETERANOV</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.851890039" lon="30.269529959">
+ <name>LENINSKIY PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.851909988" lon="30.267070038">
+ <name>LENINSKIY PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.870150015" lon="30.379449986">
+ <name>MEJDUNARODNAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.884000020" lon="30.369130019">
+ <name>BUHARESTSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.989210004" lon="30.255000014">
+ <name>STARAYA DEREVNYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.955720026" lon="30.355719980">
+ <name>PLOSCHAD' LENINA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.958540034" lon="30.354720019">
+ <name>PLOSCHAD' LENINA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.970929995" lon="30.347470008">
+ <name>VYBORGSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928719988" lon="30.412690016">
+ <name>NOVOCHERKASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929109998" lon="30.410880027">
+ <name>NOVOCHERKASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929390037" lon="30.412190035">
+ <name>NOVOCHERKASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928399967" lon="30.411389982">
+ <name>NOVOCHERKASSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.984740019" lon="30.344269965">
+ <name>LESNAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.999510022" lon="30.366089987">
+ <name>PLOSCHAD' MUJESTVA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008819969" lon="30.370819978">
+ <name>POLITEHNICHESKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.012640022" lon="30.395899974">
+ <name>AKADEMICHESKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.034860028" lon="30.418140013">
+ <name>GRAJDANSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.051280009" lon="30.332319969">
+ <name>PROSPEKT PROSVESCHENIYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.037030019" lon="30.321279997">
+ <name>OZERKI</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.016599968" lon="30.315549960">
+ <name>UDEL'NAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.960880009" lon="30.291950041">
+ <name>CHKALOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.932350023" lon="30.439159982">
+ <name>LADOJSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.051329965" lon="30.443380019">
+ <name>DEVYATKINO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.956059996" lon="30.318789985">
+ <name>GOR'KOVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.966239985" lon="30.311139990">
+ <name>PETROGRADSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008389978" lon="30.258299969">
+ <name>KOMENDANTSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008610003" lon="30.259049982">
+ <name>KOMENDANTSKII PROSPEKT</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.067550037" lon="30.334619964">
+ <name>PARNAS</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.948359961" lon="30.234490000">
+ <name>PRIMORSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.951539971" lon="30.291969990">
+ <name>SPORTIVNAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.985400010" lon="30.300780041">
+ <name>CHERNAYA RECHKA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.907359965" lon="30.483409977">
+ <name>ULICA DYBENKO</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.919889988" lon="30.466750022">
+ <name>PROSPEKT BOL'SHEVIKOV</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.971670033" lon="30.259390036">
+ <name>KRESTOVSKII OSTROV</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.002440000" lon="30.296609960">
+ <name>PIONERSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.942549961" lon="30.278170025">
+ <name>VASILEOSTROVSKAYA</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.947629981" lon="30.283499993">
+ <name>SPORTIVNAYA-2</name>
+ <cmt>Subway</cmt>
+ <desc>Subway</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+</gpx>
--- /dev/null
+No,Latitude,Longitude,Name,Description,Symbol\r
+1,59.867220,30.261330,"АВТОВО","Метро","Waypoint"\r
+2,59.935860,30.314990,"АДМИРАЛТЕЙСКАЯ","Метро","Waypoint"\r
+3,60.012640,30.395900,"АКАДЕМИЧЕСКАЯ","Метро","Waypoint"\r
+4,59.907120,30.299420,"БАЛТИЙСКАЯ","Метро","Waypoint"\r
+5,59.884000,30.369130,"БУХАРЕСТСКАЯ","Метро","Waypoint"\r
+6,59.942550,30.278170,"ВАСИЛЕОСТРОВСКАЯ","Метро","Waypoint"\r
+7,59.927570,30.347970,"ВЛАДИМИРСКАЯ","Метро","Waypoint"\r
+8,59.895710,30.357010,"ВОЛКОВСКАЯ","Метро","Waypoint"\r
+9,59.970930,30.347470,"ВЫБОРГСКАЯ","Метро","Waypoint"\r
+10,59.956060,30.318790,"ГОРЬКОВСКАЯ","Метро","Waypoint"\r
+11,59.934000,30.333390,"ГОСТИНЫЙ ДВОР","Метро","Waypoint"\r
+12,60.034860,30.418140,"ГРАЖДАНСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+13,60.051330,30.443380,"ДЕВЯТКИНО","Метро","Waypoint"\r
+14,59.928220,30.346220,"ДОСТОЕВСКАЯ","Метро","Waypoint"\r
+15,59.896520,30.423600,"ЕЛИЗАРОВСКАЯ","Метро","Waypoint"\r
+16,59.833130,30.349370,"ЗВЕЗДНАЯ","Метро","Waypoint"\r
+17,59.922290,30.335770,"ЗВЕНИГОРОДСКАЯ","Метро","Waypoint"\r
+18,59.879610,30.261940,"КИРОВСКИЙ ЗАВОД","Метро","Waypoint"\r
+19,60.008390,30.258300,"КОМЕНДАНТСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+20,60.008610,30.259050,"КОМЕНДАНТСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+21,59.971670,30.259390,"КРЕСТОВСКИЙ ОСТРОВ","Метро","Waypoint"\r
+22,59.829070,30.375320,"КУПЧИНО","Метро","Waypoint"\r
+23,59.829950,30.374870,"КУПЧИНО","Метро","Waypoint"\r
+24,59.932350,30.439160,"ЛАДОЖСКАЯ","Метро","Waypoint"\r
+25,59.851890,30.269530,"ЛЕНИНСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+26,59.851910,30.267070,"ЛЕНИНСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+27,59.984740,30.344270,"ЛЕСНАЯ","Метро","Waypoint"\r
+28,59.920600,30.354880,"ЛИГОВСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+29,59.877270,30.441740,"ЛОМОНОСОВСКАЯ","Метро","Waypoint"\r
+30,59.931520,30.355010,"МАЯКОВСКАЯ","Метро","Waypoint"\r
+31,59.870150,30.379450,"МЕЖДУНАРОДНАЯ","Метро","Waypoint"\r
+32,59.849180,30.321060,"МОСКОВСКАЯ","Метро","Waypoint"\r
+33,59.853290,30.320870,"МОСКОВСКАЯ","Метро","Waypoint"\r
+34,59.853200,30.321640,"МОСКОВСКАЯ","Метро","Waypoint"\r
+35,59.849370,30.322060,"МОСКОВСКАЯ","Метро","Waypoint"\r
+36,59.891530,30.318090,"МОСКОВСКИЕ ВОРОТА","Метро","Waypoint"\r
+37,59.901080,30.274850,"НАРВСКАЯ","Метро","Waypoint"\r
+38,59.934430,30.329950,"НЕВСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+39,59.934940,30.330100,"НЕВСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+40,59.935460,30.326920,"НЕВСКИЙ ПРОСПЕКТ","Метро","Waypoint"\r
+41,59.928720,30.412690,"НОВОЧЕРКАССКАЯ","Метро","Waypoint"\r
+42,59.929110,30.410880,"НОВОЧЕРКАССКАЯ","Метро","Waypoint"\r
+43,59.929390,30.412190,"НОВОЧЕРКАССКАЯ","Метро","Waypoint"\r
+44,59.928400,30.411390,"НОВОЧЕРКАССКАЯ","Метро","Waypoint"\r
+45,59.944070,30.306680,"О справочнике Санкт-Петербург Метро - 2016.05","Этот файл содержит информацию о станциях метро Санкт-Петербурга. Адаптация для навигаторов GARMIN и публикация - Навиком, 2016. http://navicom.ru","Waypoint"\r
+46,59.914630,30.349510,"ОБВОДНЫЙ КАНАЛ","Метро","Waypoint"\r
+47,59.848610,30.457700,"ОБУХОВО","Метро","Waypoint"\r
+48,60.037030,30.321280,"ОЗЕРКИ","Метро","Waypoint"\r
+49,59.866260,30.321780,"ПАРК ПОБЕДЫ","Метро","Waypoint"\r
+50,60.067550,30.334620,"ПАРНАС","Метро","Waypoint"\r
+51,59.966240,30.311140,"ПЕТРОГРАДСКАЯ","Метро","Waypoint"\r
+52,60.002440,30.296610,"ПИОНЕРСКАЯ","Метро","Waypoint"\r
+53,59.924250,30.385180,"ПЛОЩАДЬ АЛЕКСАНДРА НЕВСКОГО-1","Метро","Waypoint"\r
+54,59.923510,30.383310,"ПЛОЩАДЬ АЛЕКСАНДРА НЕВСКОГО-2","Метро","Waypoint"\r
+55,59.931510,30.360440,"ПЛОЩАДЬ ВОССТАНИЯ","Метро","Waypoint"\r
+56,59.929550,30.361010,"ПЛОЩАДЬ ВОССТАНИЯ","Метро","Waypoint"\r
+57,59.955720,30.355720,"ПЛОЩАДЬ ЛЕНИНА","Метро","Waypoint"\r
+58,59.958540,30.354720,"ПЛОЩАДЬ ЛЕНИНА","Метро","Waypoint"\r
+59,59.999510,30.366090,"ПЛОЩАДЬ МУЖЕСТВА","Метро","Waypoint"\r
+60,60.008820,30.370820,"ПОЛИТЕХНИЧЕСКАЯ","Метро","Waypoint"\r
+61,59.948360,30.234490,"ПРИМОРСКАЯ","Метро","Waypoint"\r
+62,59.865210,30.470140,"ПРОЛЕТАРСКАЯ","Метро","Waypoint"\r
+63,59.919890,30.466750,"ПРОСПЕКТ БОЛЬШЕВИКОВ","Метро","Waypoint"\r
+64,59.842180,30.249950,"ПРОСПЕКТ ВЕТЕРАНОВ","Метро","Waypoint"\r
+65,59.841280,30.253230,"ПРОСПЕКТ ВЕТЕРАНОВ","Метро","Waypoint"\r
+66,60.051280,30.332320,"ПРОСПЕКТ ПРОСВЕЩЕНИЯ","Метро","Waypoint"\r
+67,59.920590,30.329700,"ПУШКИНСКАЯ","Метро","Waypoint"\r
+68,59.830660,30.500100,"РЫБАЦКОЕ","Метро","Waypoint"\r
+69,59.926300,30.317890,"САДОВАЯ","Метро","Waypoint"\r
+70,59.927090,30.320630,"СЕННАЯ ПЛОЩАДЬ","Метро","Waypoint"\r
+71,59.926580,30.317120,"СПАССКАЯ","Метро","Waypoint"\r
+72,59.926720,30.319720,"СПАССКАЯ","Метро","Waypoint"\r
+73,59.951540,30.291970,"СПОРТИВНАЯ","Метро","Waypoint"\r
+74,59.947630,30.283500,"СПОРТИВНАЯ-2","Метро","Waypoint"\r
+75,59.989210,30.255000,"СТАРАЯ ДЕРЕВНЯ","Метро","Waypoint"\r
+76,59.916310,30.318670,"ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ","Метро","Waypoint"\r
+77,60.016600,30.315550,"УДЕЛЬНАЯ","Метро","Waypoint"\r
+78,59.907360,30.483410,"УЛИЦА ДЫБЕНКО","Метро","Waypoint"\r
+79,59.906180,30.317830,"ФРУНЗЕНСКАЯ","Метро","Waypoint"\r
+80,59.985400,30.300780,"ЧЕРНАЯ РЕЧКА","Метро","Waypoint"\r
+81,59.944460,30.359630,"ЧЕРНЫШЕВСКАЯ","Метро","Waypoint"\r
+82,59.960880,30.291950,"ЧКАЛОВСКАЯ","Метро","Waypoint"\r
+83,59.879080,30.318630,"ЭЛЕКТРОСИЛА","Метро","Waypoint"\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - http://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="59.829069972" minlon="30.234490000" maxlat="60.067550037" maxlon="30.500100022"/>
+ <wpt lat="59.944070019" lon="30.306679979">
+ <name>О справочнике Санкт-Петербург Метро - 2016.05</name>
+ <cmt>Этот файл содержит информацию о станциях метро Санкт-Петербурга. Адаптация для навигаторов GARMIN и публикация - Навиком, 2016. http://navicom.ru</cmt>
+ <desc>Этот файл содержит информацию о станциях метро Санкт-Петербурга. Адаптация для навигаторов GARMIN и публикация - Навиком, 2016. http://navicom.ru</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.830660019" lon="30.500100022">
+ <name>РЫБАЦКОЕ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934429992" lon="30.329949986">
+ <name>НЕВСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.944460029" lon="30.359629970">
+ <name>ЧЕРНЫШЕВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.924250003" lon="30.385180023">
+ <name>ПЛОЩАДЬ АЛЕКСАНДРА НЕВСКОГО-1</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.923509965" lon="30.383310020">
+ <name>ПЛОЩАДЬ АЛЕКСАНДРА НЕВСКОГО-2</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934940031" lon="30.330100022">
+ <name>НЕВСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.896519985" lon="30.423599984">
+ <name>ЕЛИЗАРОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.879080011" lon="30.318629974">
+ <name>ЭЛЕКТРОСИЛА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.922289979" lon="30.335769961">
+ <name>ЗВЕНИГОРОДСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.920589961" lon="30.329700038">
+ <name>ПУШКИНСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.849180002" lon="30.321059972">
+ <name>МОСКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926299965" lon="30.317890020">
+ <name>САДОВАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.895710042" lon="30.357010039">
+ <name>ВОЛКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.935459960" lon="30.326920012">
+ <name>НЕВСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.931509988" lon="30.360439997">
+ <name>ПЛОЩАДЬ ВОССТАНИЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929549964" lon="30.361009967">
+ <name>ПЛОЩАДЬ ВОССТАНИЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.931519963" lon="30.355010033">
+ <name>МАЯКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.920600019" lon="30.354880029">
+ <name>ЛИГОВСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.927569991" lon="30.347969988">
+ <name>ВЛАДИМИРСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928220008" lon="30.346220015">
+ <name>ДОСТОЕВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.916309994" lon="30.318670040">
+ <name>ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.907119991" lon="30.299419994">
+ <name>БАЛТИЙСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.906179961" lon="30.317830006">
+ <name>ФРУНЗЕНСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.927089959" lon="30.320629980">
+ <name>СЕННАЯ ПЛОЩАДЬ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.901079992" lon="30.274850037">
+ <name>НАРВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.879609998" lon="30.261939978">
+ <name>КИРОВСКИЙ ЗАВОД</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.867220037" lon="30.261330027">
+ <name>АВТОВО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.842180023" lon="30.249950001">
+ <name>ПРОСПЕКТ ВЕТЕРАНОВ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.891529987" lon="30.318090012">
+ <name>МОСКОВСКИЕ ВОРОТА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.866259973" lon="30.321779978">
+ <name>ПАРК ПОБЕДЫ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.853289984" lon="30.320870038">
+ <name>МОСКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.853199963" lon="30.321640000">
+ <name>МОСКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.833129998" lon="30.349370018">
+ <name>ЗВЕЗДНАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.848610032" lon="30.457699997">
+ <name>ОБУХОВО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.865209972" lon="30.470139999">
+ <name>ПРОЛЕТАРСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.877270022" lon="30.441740016">
+ <name>ЛОМОНОСОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.829069972" lon="30.375319971">
+ <name>КУПЧИНО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.829949988" lon="30.374870030">
+ <name>КУПЧИНО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.849370020" lon="30.322060017">
+ <name>МОСКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.914630009" lon="30.349509995">
+ <name>ОБВОДНЫЙ КАНАЛ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926580004" lon="30.317119975">
+ <name>СПАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.935860028" lon="30.314989965">
+ <name>АДМИРАЛТЕЙСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.926719982" lon="30.319720041">
+ <name>СПАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.934000000" lon="30.333390003">
+ <name>ГОСТИНЫЙ ДВОР</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.841279974" lon="30.253230007">
+ <name>ПРОСПЕКТ ВЕТЕРАНОВ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.851890039" lon="30.269529959">
+ <name>ЛЕНИНСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.851909988" lon="30.267070038">
+ <name>ЛЕНИНСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.870150015" lon="30.379449986">
+ <name>МЕЖДУНАРОДНАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.884000020" lon="30.369130019">
+ <name>БУХАРЕСТСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.989210004" lon="30.255000014">
+ <name>СТАРАЯ ДЕРЕВНЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.955720026" lon="30.355719980">
+ <name>ПЛОЩАДЬ ЛЕНИНА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.958540034" lon="30.354720019">
+ <name>ПЛОЩАДЬ ЛЕНИНА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.970929995" lon="30.347470008">
+ <name>ВЫБОРГСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928719988" lon="30.412690016">
+ <name>НОВОЧЕРКАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929109998" lon="30.410880027">
+ <name>НОВОЧЕРКАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.929390037" lon="30.412190035">
+ <name>НОВОЧЕРКАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.928399967" lon="30.411389982">
+ <name>НОВОЧЕРКАССКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.984740019" lon="30.344269965">
+ <name>ЛЕСНАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.999510022" lon="30.366089987">
+ <name>ПЛОЩАДЬ МУЖЕСТВА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008819969" lon="30.370819978">
+ <name>ПОЛИТЕХНИЧЕСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.012640022" lon="30.395899974">
+ <name>АКАДЕМИЧЕСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.034860028" lon="30.418140013">
+ <name>ГРАЖДАНСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.051280009" lon="30.332319969">
+ <name>ПРОСПЕКТ ПРОСВЕЩЕНИЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.037030019" lon="30.321279997">
+ <name>ОЗЕРКИ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.016599968" lon="30.315549960">
+ <name>УДЕЛЬНАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.960880009" lon="30.291950041">
+ <name>ЧКАЛОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.932350023" lon="30.439159982">
+ <name>ЛАДОЖСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.051329965" lon="30.443380019">
+ <name>ДЕВЯТКИНО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.956059996" lon="30.318789985">
+ <name>ГОРЬКОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.966239985" lon="30.311139990">
+ <name>ПЕТРОГРАДСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008389978" lon="30.258299969">
+ <name>КОМЕНДАНТСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.008610003" lon="30.259049982">
+ <name>КОМЕНДАНТСКИЙ ПРОСПЕКТ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.067550037" lon="30.334619964">
+ <name>ПАРНАС</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.948359961" lon="30.234490000">
+ <name>ПРИМОРСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.951539971" lon="30.291969990">
+ <name>СПОРТИВНАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.985400010" lon="30.300780041">
+ <name>ЧЕРНАЯ РЕЧКА</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.907359965" lon="30.483409977">
+ <name>УЛИЦА ДЫБЕНКО</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.919889988" lon="30.466750022">
+ <name>ПРОСПЕКТ БОЛЬШЕВИКОВ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.971670033" lon="30.259390036">
+ <name>КРЕСТОВСКИЙ ОСТРОВ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="60.002440000" lon="30.296609960">
+ <name>ПИОНЕРСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.942549961" lon="30.278170025">
+ <name>ВАСИЛЕОСТРОВСКАЯ</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+ <wpt lat="59.947629981" lon="30.283499993">
+ <name>СПОРТИВНАЯ-2</name>
+ <cmt>Метро</cmt>
+ <desc>Метро</desc>
+ <sym>Waypoint</sym>
+ </wpt>
+</gpx>
gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/umsonstdraussen.gpx
compare ${REFERENCE}/umsonstdraussen.gpx ${TMPDIR}/umsonstdraussen.gpx
-# look for differnces between latin1 and windows-1252
+# look for differences between latin1 and windows-1252
gpsbabel -i garmin_gpi -f ${REFERENCE}/garmin_gpi_encoding.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/garmin_gpi_encoding.gpx
compare ${REFERENCE}/garmin_gpi_encoding.gpx ${TMPDIR}/garmin_gpi_encoding.gpx
gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi_encoding.gpx -o garmin_gpi -F ${TMPDIR}/garmin_gpi_encoding.gpi
gpsbabel -i garmin_gpi -f ${TMPDIR}/garmin_gpi_encoding.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/garmin_gpi_encoding2.gpi.gpx
compare ${REFERENCE}/garmin_gpi_encoding2.gpi.gpx ${TMPDIR}/garmin_gpi_encoding2.gpi.gpx
+
+# check category encoding
+gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi.gpx -o garmin_gpi,category="Vinícolas",hide -F ${TMPDIR}/garmin_gpi_category~gpx.gpi
+compare ${REFERENCE}/garmin_gpi_category~gpx.gpi ${TMPDIR}/garmin_gpi_category~gpx.gpi
+
+# check dual language read
+# spb_metro_norm.gpi from https://www.garmin.ru/download/extras/poi.php or https://files.navicom.ru/spb_metro_norm.gpi
+gpsbabel -i garmin_gpi,languagecode=RU -f ${REFERENCE}/spb_metro_norm.gpi -o gpx -F ${TMPDIR}/spb_metro_norm_ru~gpi.gpx
+compare ${REFERENCE}/spb_metro_norm_ru~gpi.gpx ${TMPDIR}/spb_metro_norm_ru~gpi.gpx
+gpsbabel -i garmin_gpi,languagecode=EN -f ${REFERENCE}/spb_metro_norm.gpi -o gpx -F ${TMPDIR}/spb_metro_norm_en~gpi.gpx
+compare ${REFERENCE}/spb_metro_norm_en~gpi.gpx ${TMPDIR}/spb_metro_norm_en~gpi.gpx
+
+# check utf8 write
+gpsbabel -i gpx -f ${REFERENCE}/spb_metro_norm_ru~gpi.gpx -o garmin_gpi,writecodec=utf8,unique=0 -F ${TMPDIR}/spb_metro_norm_ru~gpi~gpx.gpi
+gpsbabel -i garmin_gpi -f ${TMPDIR}/spb_metro_norm_ru~gpi~gpx.gpi -x sort,shortname -o unicsv -F ${TMPDIR}/spb_metro_norm_ru~gpi~gpx~gpi.csv
+gpsbabel -i garmin_gpi,languagecode=RU -f ${REFERENCE}/spb_metro_norm.gpi -x sort,shortname -o unicsv -F ${TMPDIR}/spb_metro_norm_ru~gpi.csv
+compare ${REFERENCE}/spb_metro_norm_ru~gpi.csv ${TMPDIR}/spb_metro_norm_ru~gpi~gpx~gpi.csv
+compare ${REFERENCE}/spb_metro_norm_ru~gpi.csv ${TMPDIR}/spb_metro_norm_ru~gpi.csv
+